package com.xzzz.irda.auth.core.constants;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 授权模块静态参数
 *
 * @author wangyf
 * 
 */
public interface AuthConstant {

    /**
     * token 所在的请求头名称
     */
    String HEADER_AUTHORIZATION = "Authorization";

    /**
     * token 前缀, 遵循 Oauth2.0 规范 (RFC6750: https://tools.ietf.org/html/rfc6750)
     * <p>
     * 参考文档:
     * https://tools.ietf.org/html/RFC6750
     * https://learning.postman.com/docs/sending-requests/authorization/
     */
    String HEADER_TOKEN_PREFIX = "Bearer ";

    /**
     * 默认忽略的请求
     */
    List<String> DEFAULT_WHITE_LIST = new ArrayList<String>() {
        private static final long serialVersionUID = -2991587957189162461L;

        {
            // 登录接口
            this.add("/login");
            this.add("/error");
            // 负载均衡
            this.add("/lb/**");
            // sentinel
            this.add("/sentinel/**");
            // guardcat
            this.add("/guardcat/**");
            // tracker
            this.add("/tracker/**");
            // 获取图片验证码接口
            this.add("/captcha/**");
            // 一些默认的本地静态资源, 一些非前后端分离的静态文件, 如某些框架自带的操作界面(如 swagger)等
            this.add("/favicon.ico");
            this.add("/**/**.js");
            this.add("/**/**.css");
            // swagger 默认请求路径
            this.add("/doc.html");
            this.add("/webjars/**");
            this.add("/swagger-resources");
            this.add("/v2/**");
        }
    };

    /**
     * 标识请求时白名单, 为后续过滤器判断使用
     */
    String WHITE_LIST_ATTRIBUTE_KEY = "IS_WHITE_LIST";

    /**
     * 各处的参数,如在json中的参数
     */
    String GRANT_TYPE_PARAM = "grantType";
    String CLIENT_TYPE_PARAM = "clientType";
    String TOKEN_PARAM = "token";
    String PERMISSIONS_PARAM = "permissions";

    /**
     * 默认客户端配置, 实现端可覆盖默认配置
     */
    String CLIENT_DEFAULT_TYPE = "default";
    Long CLIENT_DEFAULT_EXPIRE = 3600L;
    Boolean CLIENT_DEFAULT_REFRESH = true;

    /**
     * context-path
     */
    String SERVLET_CONTEXT_PATH = "server.servlet.context-path";

    /**
     * 开启注解的全限定名
     */
    String SERVER_ANNOTATION_NAME = "com.xzzz.irda.auth.server.EnableAuthServer";
    String CLIENT_ANNOTATION_NAME = "com.xzzz.irda.auth.client.EnableAuthClient";

    String ENV_NAME_PROD = "prod";

    /**
     * /**
     * 和 redis 相关的配置
     */
    interface Redis {
        /**
         * 授权对象的 Redis key 前缀
         */
        String KEY_AUTHORIZATION = "auth:authorization:";
        /**
         * Redis 超时时间单位
         */
        TimeUnit EXPIRE_TIME_UNIT = TimeUnit.SECONDS;
        /**
         * 用户对应平台唯一有效的 token 的前缀
         */
        String UNIQUE_TOKEN_PREFIX = "auth:unique_token:userid_";
        /**
         * 用户对应平台唯一有效的 token 的中间值
         */
        String UNIQUE_TOKEN_INFIX = ":client_";
    }

    interface Filter {
        int REQUEST_WRAPPER_FILTER = -1000;
        int LOG_FILTER = -100;
        int WHITE_LIST_FILTER = 0;
        int AUTHORIZATION_VALIDATE_FILTER = 100;
        int AUTHORIZATION_UNIQUE_FILTER = 200;
        int TOKEN_EXPIRE_RESET_FILTER = 300;

    }
}
